package com.sfx.算法专题.回溯.A总结题型;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: sfx
 */
public class A总结题型 {

    // 1. 什么是递归
    // 函数自己调用自己的情况
    // 二叉树的遍历  (后序遍历- 左右根)
    // 快排(前序)
    // 归并(后序)

    // 2. 为什么会用到递归
    // 本质 : 本质上解决主问题的时候出现了相同的子问题.同样的解决方案,我们就会使用递归
    // 处理一个大问题的逻辑,会把大问题划分为多个子问题
    // 然后对这些子问题进行同样的处理
    // 主问题 --> 相同的子问题
    // 子问题 -> 相同的子问题
    // 一直下去.....
    // 解决了大问题遇到了相同的子问题,解决大问题的思路与解决小问题的思路是一模一样的,我们就可以使用递归



    // 3. 如何理解递归
    // 3.1 递归展开的细节图
    // 3.2 二叉树中的题目
    // 3.3 宏观的看待递归的过程
    // 3.3.1 不要在意递归的细节展开图
    // 3.3.2 把递归的函数当成一个黑盒
    // 3.3.3 相信这个黑盒一定能完成这个任务


    // 4. 如何写好一个递归 ?
    // 4.1 先找到相同的子问题->函数头设计(把相同的子问题抽象出函数头)
    // 4.2 只关心某一个子问题如何解决的->函数体的书写(具体问题的解决在函数体中书写代码)
    // 4.3 注意一下递归函数的出口即可


    // 5. 深度优先遍历  VS  深度优先搜索 (DFS)
    //    宽度优先遍历  VS  宽度优先搜索 (BFS)
    // 遍历是形式, 目的是搜索


    // 6. 循环(迭代) VS 递归 有什么关系
    // 递归展开图简单地可以修改为循环,但是当复杂的我们就需要使用递归


    // 7. 递归 VS 深搜
    // 递归的展开图,其实就是对一棵树做一次深度优先遍历(DFS)


    // 8. 二叉树的深搜
    // 8.1当需要改变数的结构的话,比如让数的节点变少,那么递归的时候,就必须要有返回值
    // 类似于 root.left = f(root.left,....) root.right = f(root.right,....)
    // 8.2 通过递归的逻辑总结出,函数头,函数体怎么进行设计
    // 我到了某一层,我需要做什么事情
    // 我需要得到什么,才能计算出我想要的结果
    // 我需要做什么事情->递归流程(重复子问题的流程)
    // 递归终止条件




}